#include "GAF_OutPut.h"

#ifdef GAF_DEBUG

#include "GAF_Platform.h"

// #define GAF_PRM_OUTPUTSCREEN_FONTFILE_s		"TTFFontFile"

namespace GAF
{
	OutPut& OutPut::GetInstance()
	{
		static OutPut s_OutPut;
		return s_OutPut;
	}

	OutPut::OutPut()
	{
		m_strOutText = "";
		m_isFile = false;
		m_isScreen = false;
	}

	OutPut::~OutPut()
	{
		CloseFile();
	}

	void OutPut::Out(STD_STRING strText, OutType otType, STD_STRING strFile, int nLine, ...)
	{
		// 清空字符串
		m_strOutText.clear();

		// 写入类型头
		switch(otType)
		{
		case OUT_NOTE:
			m_strOutText.append("");
			break;
		case OUT_WARM:
			m_strOutText.append("WARM: ");
			break;
		case OUT_LOG:
			m_strOutText.append("LOG: ");
			break;
		case OUT_MARK:
			m_strOutText.append("MARK: ");
			break;
		case OUT_ERROR:
			m_strOutText.append("ERROR: ");
			break;
		}

		// 解析格式化字符串
		const char* _szText = strText.c_str();
		char _szFormatText[1024];
		SYS_VA_LIST _vlArgs;
		SYS_VA_START(_vlArgs, nLine);
		SYS_VSNPRINTF(_szFormatText, 1023, _szText, _vlArgs);
		SYS_VA_END(_vlArgs);

		// 写入字符串
		m_strOutText.append(_szFormatText);

		// 换行
		if(otType == OUT_WARM || otType == OUT_LOG || otType == OUT_ERROR)
			m_strOutText.append("\n");

		// 加入位置标记
		if(otType == OUT_LOG || otType == OUT_MARK || otType == OUT_ERROR)
		{
			m_strOutText.append("\tAt - ");
			CreateMark(strFile, nLine);
			m_strOutText.append("\n");
		}

		// 输出
		ConsoleOut(m_strOutText);
		ScreenOut(m_strOutText, otType);
		FileOut(m_strOutText);
	}

	void OutPut::CreateMark(STD_STRING strFile, int nLine)
	{
		GAF_CHECK(strFile != "");
		GAF_CHECK(nLine > 0);

		STD_STRING _strFile_ = strFile.substr(strFile.find_last_of('/') + 1);
		STD_STRING _strFile = strFile.substr(_strFile_.find_last_of('\\') + 1);

		char _szLine[10];
		SYS_SPRINTF(_szLine, "%d", nLine);
		m_strOutText.append("\"");
		m_strOutText.append(_strFile);
		m_strOutText.append("\" (LINE:");
		m_strOutText.append(_szLine);
		m_strOutText.append(")");
	}

	void OutPut::ToScreen(STD_STRING strTTFFontFile)
	{
		m_isScreen = true;

// 		Bundle _bdlParam;
// 		_bdlParam.ARG_STRING(GAF_PRM_OUTPUTSCREEN_FONTFILE_s, strTTFFontFile);
// 		m_OutScreen.Init(&_bdlParam);
	}

	void OutPut::ToFile(STD_STRING strFile)
	{
 		if(!m_isFile)
 		{
			m_ofOutFile.open(strFile.c_str());
  			m_isFile = true;
 		}
	}

	void OutPut::CloseFile()
	{
 		if(m_isFile)
 		{
			m_ofOutFile.close();
  			m_isFile = false;
 		}
	}

	void OutPut::ConsoleOut(STD_STRING strText)
	{
		if(!m_isScreen)
		{
			STD_COUT << strText;
		}
	}

	void OutPut::ScreenOut(STD_STRING strText, OutType otType)
	{
		if(m_isScreen)
		{
// 			m_OutScreen.Out(strText, otType);
		}
	}

	void OutPut::FileOut(STD_STRING strText)
	{
 		if(m_isFile)
 		{
  			m_ofOutFile << strText;
 		}
	}
}

#endif /*GAF_DEBUG*/
